Prepare data

Read and format data


df_ger_covid <- read_csv('Germany_timeseries_prep.csv')
df_ger_socdist <- read_csv('Germany_socdist_fb_kreis.csv')
df_ger_ctrl <- read_delim('Germany_controls.csv', delim = ';')

# prevalence 
df_ger_covid_clean <- df_ger_covid %>% mutate(date = as.Date(date, "%d%b%Y"),
                                  kreis = as.character(kreis)) %>% 
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>% 
  group_by(kreis) %>% 
  mutate(time = row_number()) %>% 
  ungroup() %>% 
  dplyr::select(-runday, -kreis_name, -ewz, -shape__area, 
                -cumcase, -anzahlfall, -popdens) %>%
  dplyr::rename(pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = neuro)

df_ger_covid_clean %>% head()

# social distancing
df_ger_socdist_clean <- df_ger_socdist %>% 
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>% 
  mutate(kreis = as.character(kreis)) %>%
  group_by(kreis) %>% 
  mutate(time = row_number()) %>% 
  ungroup() %>% 
  rename(socdist_single_tile = all_day_ratio_single_tile_users) %>%
  select(kreis, time, socdist_single_tile)

df_ger_socdist_clean %>% head()
NA
# controls 
df_ger_ctrl_clean <- df_ger_ctrl %>% select(-kreis_nme) %>%
    mutate(kreis = as.character(kreis),
           hospital_beds = as.numeric(str_replace(hospital_beds, ',', '.')))

df_ger_ctrl_clean %>% head()
NA
NA

# merge
df_ger <- df_ger_covid_clean %>% 
  plyr::join(df_ger_socdist_clean, by = c('kreis', 'time')) %>% 
  inner_join(df_ger_ctrl_clean, by = 'kreis')

df_ger
NA

Explore data

Plot prevalence over time


df_ger %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot social distancing (single tile) over time


df_ger %>% ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Control for weekend effect


weekend <- c(6, 7, 13, 14, 20, 21)

df_ger_loess <- df_ger %>% filter(!time %in% weekend) %>% 
  split(.$kreis) %>%
  map(~ loess(socdist_single_tile ~ time, data = .)) %>%
  map(predict, 1:23) %>% 
  bind_rows() %>% 
  gather(key = 'kreis', value = 'loess') %>% 
  group_by(kreis) %>% 
  mutate(time = row_number())


df_ger <- df_ger %>% merge(df_ger_loess, by=c('kreis', 'time')) %>% 
  mutate(socdist_single_tile_clean = ifelse(time %in% weekend, loess,
                                            socdist_single_tile)) %>%
  arrange(kreis, time)


df_ger %>% ggplot(aes(x=time, y=loess, group=kreis)) +
  geom_line()

NA
NA

df_ger %>% ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Correlations


df_ger %>% group_by(kreis) %>% 
  summarize_if(is.numeric, mean) %>% 
  select(-kreis, -time) %>% 
  cor(use='pairwise.complete') %>% 
  round(3)
                          pers_e pers_a pers_c pers_n pers_o rate_day socdist_single_tile  women academics    cdu    afd hospital_beds
pers_e                     1.000  0.223  0.255 -0.375  0.277    0.168               0.149 -0.011     0.162  0.111 -0.108        -0.037
pers_a                     0.223  1.000  0.347 -0.379  0.167    0.135               0.002 -0.009     0.180  0.023  0.015         0.004
pers_c                     0.255  0.347  1.000 -0.373 -0.063   -0.010               0.030 -0.046    -0.045 -0.006  0.140        -0.157
pers_n                    -0.375 -0.379 -0.373  1.000 -0.046   -0.127              -0.141 -0.012    -0.068 -0.061  0.064         0.111
pers_o                     0.277  0.167 -0.063 -0.046  1.000    0.115               0.090 -0.094     0.431 -0.053 -0.187         0.281
rate_day                   0.168  0.135 -0.010 -0.127  0.115    1.000               0.265 -0.026     0.128  0.136 -0.135        -0.060
socdist_single_tile        0.149  0.002  0.030 -0.141  0.090    0.265               1.000  0.049    -0.018  0.149 -0.301        -0.243
women                     -0.011 -0.009 -0.046 -0.012 -0.094   -0.026               0.049  1.000    -0.001  0.074 -0.089         0.009
academics                  0.162  0.180 -0.045 -0.068  0.431    0.128              -0.018 -0.001     1.000 -0.208 -0.117         0.335
cdu                        0.111  0.023 -0.006 -0.061 -0.053    0.136               0.149  0.074    -0.208  1.000 -0.157        -0.091
afd                       -0.108  0.015  0.140  0.064 -0.187   -0.135              -0.301 -0.089    -0.117 -0.157  1.000        -0.030
hospital_beds             -0.037  0.004 -0.157  0.111  0.281   -0.060              -0.243  0.009     0.335 -0.091 -0.030         1.000
tourism_beds              -0.115 -0.134 -0.102  0.007 -0.108   -0.038              -0.012  0.003    -0.156  0.115 -0.011        -0.043
gdp                        0.121  0.064  0.000 -0.067  0.247    0.110              -0.047 -0.044     0.374 -0.078 -0.133         0.266
manufact                  -0.009 -0.061 -0.051 -0.007 -0.038    0.076              -0.071  0.026    -0.088  0.019  0.065         0.070
airport                   -0.188 -0.167 -0.112  0.171 -0.222   -0.031              -0.142  0.043    -0.331  0.105  0.183        -0.046
age                        0.007  0.086  0.008 -0.016 -0.063   -0.034              -0.017 -0.046    -0.051  0.020  0.091         0.029
popdens                    0.062  0.038  0.018 -0.080  0.072    0.092               0.110 -0.001     0.056 -0.016 -0.028         0.024
loess                      0.139 -0.013  0.020 -0.143  0.105    0.229               0.979  0.040     0.012  0.124 -0.344        -0.229
socdist_single_tile_clean  0.138 -0.015  0.020 -0.142  0.104    0.228               0.979  0.041     0.010  0.123 -0.344        -0.228
                          tourism_beds    gdp manufact airport    age popdens  loess socdist_single_tile_clean
pers_e                          -0.115  0.121   -0.009  -0.188  0.007   0.062  0.139                     0.138
pers_a                          -0.134  0.064   -0.061  -0.167  0.086   0.038 -0.013                    -0.015
pers_c                          -0.102  0.000   -0.051  -0.112  0.008   0.018  0.020                     0.020
pers_n                           0.007 -0.067   -0.007   0.171 -0.016  -0.080 -0.143                    -0.142
pers_o                          -0.108  0.247   -0.038  -0.222 -0.063   0.072  0.105                     0.104
rate_day                        -0.038  0.110    0.076  -0.031 -0.034   0.092  0.229                     0.228
socdist_single_tile             -0.012 -0.047   -0.071  -0.142 -0.017   0.110  0.979                     0.979
women                            0.003 -0.044    0.026   0.043 -0.046  -0.001  0.040                     0.041
academics                       -0.156  0.374   -0.088  -0.331 -0.051   0.056  0.012                     0.010
cdu                              0.115 -0.078    0.019   0.105  0.020  -0.016  0.124                     0.123
afd                             -0.011 -0.133    0.065   0.183  0.091  -0.028 -0.344                    -0.344
hospital_beds                   -0.043  0.266    0.070  -0.046  0.029   0.024 -0.229                    -0.228
tourism_beds                     1.000 -0.094   -0.051   0.297  0.075  -0.157  0.031                     0.031
gdp                             -0.094  1.000    0.339  -0.085 -0.014   0.082 -0.026                    -0.027
manufact                        -0.051  0.339    1.000   0.136 -0.049   0.072 -0.119                    -0.120
airport                          0.297 -0.085    0.136   1.000  0.077  -0.179 -0.169                    -0.169
age                              0.075 -0.014   -0.049   0.077  1.000  -0.038 -0.021                    -0.021
popdens                         -0.157  0.082    0.072  -0.179 -0.038   1.000  0.094                     0.094
loess                            0.031 -0.026   -0.119  -0.169 -0.021   0.094  1.000                     1.000
socdist_single_tile_clean        0.031 -0.027   -0.120  -0.169 -0.021   0.094  1.000                     1.000
 

Modelling

Prepare functions


# function calculates all relevant models
run_models <- function(y, lvl1_x, lvl2_x, lvl2_id, data, ctrls=F){

  # subset data
  data = data %>% 
    dplyr::select(all_of(y), all_of(lvl1_x), all_of(lvl2_x), all_of(lvl2_id), 
                  popdens, rate_day)
  data = data %>% 
    dplyr::rename(y = all_of(y),
           lvl1_x = all_of(lvl1_x),
           lvl2_x = all_of(lvl2_x),
           lvl2_id = all_of(lvl2_id)
           )
  
  # configure optimization procedure
  ctrl_config <- lmeControl(opt = 'optim', maxIter = 100, msMaxIter = 100)

  # baseline
  baseline <- lme(fixed = y ~ 1, random = ~ 1 | lvl2_id, 
                    data = data,
                    correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept fixed slope
  random_intercept <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                          random = ~ 1 | lvl2_id,
                            data = data,
                            correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept random slope
  random_slope <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                      random = ~ lvl1_x | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction <- lme(fixed = y ~ lvl1_x * lvl2_x, 
                     random = ~ lvl1_x | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction)
  
  
  if (ctrls == 'dem' | ctrls == 'prev'){
    
    # random intercept random slope
    random_slope_ctrl_dem <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens,
                              random = ~ lvl1_x | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_main_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_int_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')        
    
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem)
  }
  
  if (ctrls == 'prev'){
  
    # random intercept random slope
    random_slope_ctrl_prev <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens + rate_day,
                              random = ~ lvl1_x + rate_day | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')  
    
        # cross level interaction
    interaction_ctrl_main_prev <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens + rate_day,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
  
    # cross level interaction
    interaction_ctrl_int_prev<- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens + rate_day,
                             random = ~ lvl1_x + rate_day | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')
  
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem,                    
                    "random_slope_ctrl_prev" = random_slope_ctrl_prev,
                    "interaction_ctrl_main_prev" = interaction_ctrl_main_prev,
                    "interaction_ctrl_int_prev" = interaction_ctrl_int_prev)
  }
  
  if(ctrls == 'exp'){
    # random intercept random slope
  random_slope_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) + lvl2_x, 
                      random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) * lvl2_x, 
                     random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')  
  
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction,                  
                  "random_slope_exp" = random_slope_exp,
                  "interaction_exp" = interaction_exp)
  }
  
  return(results)
        
}

# extracts table with coefficients and tests statistics
extract_results <- function(models) {
  
  models_summary <- models %>% 
  map(summary) %>% 
  map("tTable") %>% 
  map(as.data.frame) %>% 
  map(round, 10) 
  # %>% map(~ .[str_detect(rownames(.), 'Inter|lvl'),])
  
  return(models_summary)
  
}


compare_models <- function(models) {

  mdl_names <- models %>% names()
  
  str = ''
  for (i in mdl_names){
    
    mdl_str <- paste('models$', i, sep = '')
    
    if(i == 'baseline'){
      str <- mdl_str
    }else{
    str <- paste(str, mdl_str, sep=', ')
    }
  }
  
  anova_str <- paste0('anova(', str, ')')
  mdl_comp <- eval(parse(text=anova_str))
  rownames(mdl_comp) = mdl_names
  return(mdl_comp)
}

Rescale Data

df_ger_scaled <- df_ger %>% dplyr::select(kreis, time, pers_o, 
                                 pers_c, pers_e, pers_e, pers_a, pers_n,
                                 popdens, rate_day, socdist_single_tile) %>%
  mutate_at(vars(-kreis, -time), scale)

df_ger_scaled %>% head()

Predict prevalence

prevalence ~ openness


models_o_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_o_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_covid)
NA

prevalence ~ conscientiousness


models_c_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_c_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_covid)
NA
NA

prevalence ~ extraversion


models_e_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_e_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_covid)
NA
NA

prevalence ~ agreeableness


models_a_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_a_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_covid)
NA
NA

prevalence ~ neuroticism


models_n_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_n_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_covid)
NA
NA

Predict social distancing

social distancing ~ openness


models_o_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_o_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_socdist)
NA

social distancing ~ conscientiousness


models_c_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_c_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_socdist)
NA
NA
NA

social distancing ~ extraversion


models_e_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_e_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_socdist)
NA
NA
NA

social distancing ~ agreeableness


models_a_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_a_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_socdist)
NA
NA
NA

social distancing ~ neuroticism


models_n_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_n_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_socdist)
NA
NA

prevalence ~ conscientiousness


models_c_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_c_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_c_covid_exp)
NA

prevalence ~ extraversion


models_e_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_e_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_e_covid_exp)
NA

prevalence ~ agreeableness


models_a_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_a_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_a_covid_exp)
NA

prevalence ~ neuroticism


models_n_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_n_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_n_covid_exp)
NA

Create overview table

Define function to create overview tables


summary_table <- function(models, dv_name){

  temp_df_ctrl_main <- NULL
  temp_df_ctrl_int <- NULL
  
  for (i in models){
    results <- i %>% extract_results()
    
    results_ctrl_main <- results$interaction_ctrl_main_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_main <- temp_df_ctrl_main %>% rbind(results_ctrl_main)
    
    results_ctrl_int <- results$interaction_ctrl_int_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_int <- temp_df_ctrl_int %>% rbind(results_ctrl_int)
  }
  
  names_ctrl_main <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens')
  names_ctrl_int <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens*time')

  rownames(temp_df_ctrl_main) <- names_ctrl_main
  rownames(temp_df_ctrl_int) <- names_ctrl_int
  
  sum_tab <- rbind(temp_df_ctrl_main, temp_df_ctrl_int) %>% round(4)
  
  return(sum_tab)

} 

Create overview tables

# prevalence
models_prev <- list(models_o_covid, 
                    models_c_covid, 
                    models_e_covid, 
                    models_a_covid, 
                    models_n_covid)

sum_tab_prev <- summary_table(models_prev, dv_name = 'prev')

write.table(sum_tab_prev, quote=F)
Value Std.Error DF t-value p-value
prev~o*time_crtl_popdens 0.0071 0.0029 8798 2.4364 0.0149
prev~c*time_crtl_popdens 3e-04 0.003 8798 0.0944 0.9248
prev~e*time_crtl_popdens 0.0099 0.0029 8798 3.402 7e-04
prev~a*time_crtl_popdens 0.0091 0.0029 8798 3.1314 0.0017
prev~n*time_crtl_popdens -0.0072 0.0029 8798 -2.4642 0.0138
prev~o*time_crtl_popdens*time 0.0069 0.0029 8797 2.3439 0.0191
prev~c*time_crtl_popdens*time 2e-04 0.0029 8797 0.0687 0.9452
prev~e*time_crtl_popdens*time 0.0097 0.0029 8797 3.3233 9e-04
prev~a*time_crtl_popdens*time 0.009 0.0029 8797 3.086 0.002
prev~n*time_crtl_popdens*time -0.0069 0.0029 8797 -2.3608 0.0183
# social distancing
models_socdist <- list(models_o_socdist, 
                       models_c_socdist, 
                       models_e_socdist, 
                       models_a_socdist, 
                       models_n_socdist)

sum_tab_socdist <- summary_table(models_socdist, dv_name = 'socdist')

write.table(sum_tab_socdist, quote=F)
Value Std.Error DF t-value p-value
socdist~o*time_crtl_popdens 0.0041 0.0014 8798 3.0071 0.0026
socdist~c*time_crtl_popdens 0 0.0014 8798 -0.0081 0.9935
socdist~e*time_crtl_popdens 0.003 0.0014 8798 2.1539 0.0313
socdist~a*time_crtl_popdens 0.0017 0.0014 8798 1.2497 0.2114
socdist~n*time_crtl_popdens -0.0015 0.0014 8798 -1.0885 0.2764
socdist~o*time_crtl_popdens*time 0.0041 0.0014 8797 2.9445 0.0032
socdist~c*time_crtl_popdens*time 0 0.0014 8797 -0.0257 0.9795
socdist~e*time_crtl_popdens*time 0.0029 0.0014 8797 2.0978 0.036
socdist~a*time_crtl_popdens*time 0.0017 0.0014 8797 1.2133 0.2251
socdist~n*time_crtl_popdens*time -0.0014 0.0014 8797 -1.0139 0.3106

Conditional random forest analysis

Extract slopes prevalence


# slope prevalence
df_ger_slope_prev <- df_ger %>% split(.$kreis) %>% 
  map(~ lm(rate_day ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('kreis') %>% 
  rename(slope_prev = '.')

# merge with control variables 
df_ger_slope_prev <- df_ger %>% select(-time, -date, -rate_day, -socdist_single_tile) %>%
  distinct() %>% 
  inner_join(df_ger_slope_prev, by = 'kreis') %>%
  drop_na()

df_ger_slope_prev
NA

Extract slopes social distancing


# slope socdist
df_ger_slope_socdist <- df_ger %>% split(.$kreis) %>%
  map(~ lm(socdist_single_tile ~ time, data = .)) %>%
  map(coef) %>%
  map_dbl('time') %>%
  as.data.frame() %>%
  rownames_to_column('kreis') %>%
  rename(slope_socdist = '.')


# merge with control variables 
df_ger_slope_socdist <- df_ger %>% 
  select(-time, -date, -socdist_single_tile, -rate_day) %>%
  distinct() %>%
  inner_join(df_ger_slope_socdist, by = 'kreis') %>%
  drop_na()

df_ger_slope_socdist
NA

Explore distribution of slopes


df_ger_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)


df_ger_slope_socdist %>% ggplot(aes(slope_socdist)) + geom_histogram(bins = 100)

NA
NA

CRF prevalence ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_prev <- cforest(slope_prev ~ pers_o + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_o_varimp_prev <- varimp(crf_o_fit_prev, nperm = 1)
crf_o_varimp_cond_prev <- varimp(crf_o_fit_prev, conditional = T, nperm = 1)

CRF prevalence ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_prev <- cforest(slope_prev ~ pers_c + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_c_varimp_prev <- varimp(crf_c_fit_prev, nperm = 1)
crf_c_varimp_cond_prev <- varimp(crf_c_fit_prev, conditional = T, nperm = 1)

crf_c_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_c_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_prev <- cforest(slope_prev ~ pers_e + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_e_varimp_prev <- varimp(crf_e_fit_prev, nperm = 1)
crf_e_varimp_cond_prev <- varimp(crf_e_fit_prev, conditional = T, nperm = 1)

crf_e_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_e_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_prev <- cforest(slope_prev ~ pers_a + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_a_varimp_prev <- varimp(crf_a_fit_prev, nperm = 1)
crf_a_varimp_cond_prev <- varimp(crf_a_fit_prev, conditional = T, nperm = 1)

crf_a_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_a_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_prev <- cforest(slope_prev ~ pers_n + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_n_varimp_prev <- varimp(crf_n_fit_prev, nperm = 1)
crf_n_varimp_cond_prev <- varimp(crf_n_fit_prev, conditional = T, nperm = 1)

crf_n_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_n_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_fit_socdist <- cforest(slope_socdist ~ ., 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_varimp_socdist <- varimp(crf_fit_socdist, nperm = 5)
crf_varimp_cond_socdist <- varimp(crf_fit_socdist, conditional = T, nperm = 5)

crf_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_socdist <- cforest(slope_socdist ~ pers_c + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_c_varimp_socdist <- varimp(crf_c_fit_socdist, nperm = 5)
crf_c_varimp_cond_socdist <- varimp(crf_c_fit_socdist, conditional = T, nperm = 5)

crf_c_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_c_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_socdist <- cforest(slope_socdist ~ pers_e + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_e_varimp_socdist <- varimp(crf_e_fit_socdist, nperm = 5)
crf_e_varimp_cond_socdist <- varimp(crf_e_fit_socdist, conditional = T, nperm = 5)

crf_e_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_e_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_socdist <- cforest(slope_socdist ~ pers_a + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_a_varimp_socdist <- varimp(crf_a_fit_socdist, nperm = 5)
crf_a_varimp_cond_socdist <- varimp(crf_a_fit_socdist, conditional = T, nperm = 5)

crf_a_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_a_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_socdist <- cforest(slope_socdist ~ pers_n + women + academics +
                          cdu + afd + hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_n_varimp_socdist <- varimp(crf_n_fit_socdist, nperm = 5)
crf_n_varimp_cond_socdist <- varimp(crf_n_fit_socdist, conditional = T, nperm = 5)

crf_n_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

crf_n_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))
LS0tCnRpdGxlOiAiQ09WSUQxOSBHRVIiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMjMvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCgojIE1BQwoga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1VzZXJzL2hwMjUwMC9Hb29nbGUgRHJpdmUvU1RVRFkvQ29sdW1iaWEvUmVzZWFyY2gvQ29yb25hL0RhdGEvR0VSJykKIApsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCgpgYGAKCiMgUHJlcGFyZSBkYXRhCgojIyMgUmVhZCBhbmQgZm9ybWF0IGRhdGEKYGBge3IgbWVzc2FnZT1GQUxTRX0KCmRmX2dlcl9jb3ZpZCA8LSByZWFkX2NzdignR2VybWFueV90aW1lc2VyaWVzX3ByZXAuY3N2JykKZGZfZ2VyX3NvY2Rpc3QgPC0gcmVhZF9jc3YoJ0dlcm1hbnlfc29jZGlzdF9mYl9rcmVpcy5jc3YnKQpkZl9nZXJfY3RybCA8LSByZWFkX2RlbGltKCdHZXJtYW55X2NvbnRyb2xzLmNzdicsIGRlbGltID0gJzsnKQoKYGBgCgoKYGBge3J9CgojIHByZXZhbGVuY2UgCmRmX2dlcl9jb3ZpZF9jbGVhbiA8LSBkZl9nZXJfY292aWQgJT4lIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkYXRlLCAiJWQlYiVZIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmVpcyA9IGFzLmNoYXJhY3RlcihrcmVpcykpICU+JSAKICBmaWx0ZXIoZGF0ZSA+PSAnMjAyMC0wMy0wOScgJiBkYXRlIDw9ICcyMDIwLTAzLTMxJykgJT4lIAogIGdyb3VwX2J5KGtyZWlzKSAlPiUgCiAgbXV0YXRlKHRpbWUgPSByb3dfbnVtYmVyKCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIGRwbHlyOjpzZWxlY3QoLXJ1bmRheSwgLWtyZWlzX25hbWUsIC1ld3osIC1zaGFwZV9fYXJlYSwgCiAgICAgICAgICAgICAgICAtY3VtY2FzZSwgLWFuemFobGZhbGwsIC1wb3BkZW5zKSAlPiUKICBkcGx5cjo6cmVuYW1lKHBlcnNfbyA9IG9wZW4sIAogICAgICAgICBwZXJzX2MgPSBzY2ksCiAgICAgICAgIHBlcnNfZSA9IGV4dHJhLAogICAgICAgICBwZXJzX2EgPSBhZ3JlZSwKICAgICAgICAgcGVyc19uID0gbmV1cm8pCgpkZl9nZXJfY292aWRfY2xlYW4gJT4lIGhlYWQoKQpgYGAKCgpgYGB7cn0KCiMgc29jaWFsIGRpc3RhbmNpbmcKZGZfZ2VyX3NvY2Rpc3RfY2xlYW4gPC0gZGZfZ2VyX3NvY2Rpc3QgJT4lIAogIGZpbHRlcihkYXRlID49ICcyMDIwLTAzLTA5JyAmIGRhdGUgPD0gJzIwMjAtMDMtMzEnKSAlPiUgCiAgbXV0YXRlKGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSkgJT4lCiAgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBtdXRhdGUodGltZSA9IHJvd19udW1iZXIoKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgcmVuYW1lKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgPSBhbGxfZGF5X3JhdGlvX3NpbmdsZV90aWxlX3VzZXJzKSAlPiUKICBzZWxlY3Qoa3JlaXMsIHRpbWUsIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpCgpkZl9nZXJfc29jZGlzdF9jbGVhbiAlPiUgaGVhZCgpCgpgYGAKCgpgYGB7cn0KIyBjb250cm9scyAKZGZfZ2VyX2N0cmxfY2xlYW4gPC0gZGZfZ2VyX2N0cmwgJT4lIHNlbGVjdCgta3JlaXNfbm1lKSAlPiUKICAgIG11dGF0ZShrcmVpcyA9IGFzLmNoYXJhY3RlcihrcmVpcyksCiAgICAgICAgICAgaG9zcGl0YWxfYmVkcyA9IGFzLm51bWVyaWMoc3RyX3JlcGxhY2UoaG9zcGl0YWxfYmVkcywgJywnLCAnLicpKSkKCmRmX2dlcl9jdHJsX2NsZWFuICU+JSBoZWFkKCkKCgpgYGAKCgpgYGB7cn0KCiMgbWVyZ2UKZGZfZ2VyIDwtIGRmX2dlcl9jb3ZpZF9jbGVhbiAlPiUgCiAgcGx5cjo6am9pbihkZl9nZXJfc29jZGlzdF9jbGVhbiwgYnkgPSBjKCdrcmVpcycsICd0aW1lJykpICU+JSAKICBpbm5lcl9qb2luKGRmX2dlcl9jdHJsX2NsZWFuLCBieSA9ICdrcmVpcycpCgpgYGAKCgpgYGB7cn0KCmRmX2dlcgoKYGBgCgoKIyBFeHBsb3JlIGRhdGEKCiMjIyBQbG90IHByZXZhbGVuY2Ugb3ZlciB0aW1lCmBgYHtyfQoKZGZfZ2VyICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWtyZWlzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHByZXZhbGVuY2Ugb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl9nZXIgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+cHJldl90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgoKIyMjIFBsb3Qgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUKYGBge3J9CgpkZl9nZXIgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyAoc2luZ2xlIHRpbGUpIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfZ2VyICU+JSBtdXRhdGUocHJldl90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+cHJldl90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgojIyMgQ29udHJvbCBmb3Igd2Vla2VuZCBlZmZlY3QgCmBgYHtyfQoKd2Vla2VuZCA8LSBjKDYsIDcsIDEzLCAxNCwgMjAsIDIxKQoKZGZfZ2VyX2xvZXNzIDwtIGRmX2dlciAlPiUgZmlsdGVyKCF0aW1lICVpbiUgd2Vla2VuZCkgJT4lIAogIHNwbGl0KC4ka3JlaXMpICU+JQogIG1hcCh+IGxvZXNzKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChwcmVkaWN0LCAxOjIzKSAlPiUgCiAgYmluZF9yb3dzKCkgJT4lIAogIGdhdGhlcihrZXkgPSAna3JlaXMnLCB2YWx1ZSA9ICdsb2VzcycpICU+JSAKICBncm91cF9ieShrcmVpcykgJT4lIAogIG11dGF0ZSh0aW1lID0gcm93X251bWJlcigpKQoKCmRmX2dlciA8LSBkZl9nZXIgJT4lIG1lcmdlKGRmX2dlcl9sb2VzcywgYnk9Yygna3JlaXMnLCAndGltZScpKSAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4gPSBpZmVsc2UodGltZSAlaW4lIHdlZWtlbmQsIGxvZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSAlPiUKICBhcnJhbmdlKGtyZWlzLCB0aW1lKQoKCmRmX2dlciAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9bG9lc3MsIGdyb3VwPWtyZWlzKSkgKwogIGdlb21fbGluZSgpCgoKYGBgCgpgYGB7cn0KCmRmX2dlciAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWtyZWlzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHNvY2lhbCBkaXN0YW5jaW5nIChzaW5nbGUgdGlsZSkgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl9nZXIgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5wcmV2X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCgojIyMgQ29ycmVsYXRpb25zCmBgYHtyfQoKZGZfZ2VyICU+JSBncm91cF9ieShrcmVpcykgJT4lIAogIHN1bW1hcml6ZV9pZihpcy5udW1lcmljLCBtZWFuKSAlPiUgCiAgc2VsZWN0KC1rcmVpcywgLXRpbWUpICU+JSAKICBjb3IodXNlPSdwYWlyd2lzZS5jb21wbGV0ZScpICU+JSAKICByb3VuZCgzKQogCmBgYAoKIyBNb2RlbGxpbmcgCiMjIFByZXBhcmUgZnVuY3Rpb25zCgpgYGB7cn0KCiMgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbGwgcmVsZXZhbnQgbW9kZWxzCnJ1bl9tb2RlbHMgPC0gZnVuY3Rpb24oeSwgbHZsMV94LCBsdmwyX3gsIGx2bDJfaWQsIGRhdGEsIGN0cmxzPUYpewoKICAjIHN1YnNldCBkYXRhCiAgZGF0YSA9IGRhdGEgJT4lIAogICAgZHBseXI6OnNlbGVjdChhbGxfb2YoeSksIGFsbF9vZihsdmwxX3gpLCBhbGxfb2YobHZsMl94KSwgYWxsX29mKGx2bDJfaWQpLCAKICAgICAgICAgICAgICAgICAgcG9wZGVucywgcmF0ZV9kYXkpCiAgZGF0YSA9IGRhdGEgJT4lIAogICAgZHBseXI6OnJlbmFtZSh5ID0gYWxsX29mKHkpLAogICAgICAgICAgIGx2bDFfeCA9IGFsbF9vZihsdmwxX3gpLAogICAgICAgICAgIGx2bDJfeCA9IGFsbF9vZihsdmwyX3gpLAogICAgICAgICAgIGx2bDJfaWQgPSBhbGxfb2YobHZsMl9pZCkKICAgICAgICAgICApCiAgCiAgIyBjb25maWd1cmUgb3B0aW1pemF0aW9uIHByb2NlZHVyZQogIGN0cmxfY29uZmlnIDwtIGxtZUNvbnRyb2wob3B0ID0gJ29wdGltJywgbWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwKQoKICAjIGJhc2VsaW5lCiAgYmFzZWxpbmUgPC0gbG1lKGZpeGVkID0geSB+IDEsIHJhbmRvbSA9IH4gMSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyByYW5kb20gaW50ZXJjZXB0IGZpeGVkIHNsb3BlCiAgcmFuZG9tX2ludGVyY2VwdCA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICsgbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IDEgfCBsdmwyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgcmFuZG9tIGludGVyY2VwdCByYW5kb20gc2xvcGUKICByYW5kb21fc2xvcGUgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgaW50ZXJhY3Rpb24gPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uKQogIAogIAogIGlmIChjdHJscyA9PSAnZGVtJyB8IGN0cmxzID09ICdwcmV2Jyl7CiAgICAKICAgICMgcmFuZG9tIGludGVyY2VwdCByYW5kb20gc2xvcGUKICAgIHJhbmRvbV9zbG9wZV9jdHJsX2RlbSA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICsgbHZsMl94ICsgcG9wZGVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0gPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIHBvcGRlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0gPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIGx2bDFfeCAqIHBvcGRlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpICAgICAgICAKICAgIAogICAgIyBjcmVhdGUgbGlzdCB3aXRoIHJlc3VsdHMKICAgIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGUiID0gcmFuZG9tX3Nsb3BlLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2N0cmxfZGVtIiA9IHJhbmRvbV9zbG9wZV9jdHJsX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtKQogIH0KICAKICBpZiAoY3RybHMgPT0gJ3ByZXYnKXsKICAKICAgICMgcmFuZG9tIGludGVyY2VwdCByYW5kb20gc2xvcGUKICAgIHJhbmRvbV9zbG9wZV9jdHJsX3ByZXYgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCArIHBvcGRlbnMgKyByYXRlX2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggKyByYXRlX2RheSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKSAgCiAgICAKICAgICAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiA8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgcG9wZGVucyArIHJhdGVfZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogIAogICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9pbnRfcHJldjwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBsdmwxX3ggKiBwb3BkZW5zICsgcmF0ZV9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggKyByYXRlX2RheSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAgICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9jdHJsX2RlbSIgPSByYW5kb21fc2xvcGVfY3RybF9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfaW50X2RlbSwgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfY3RybF9wcmV2IiA9IHJhbmRvbV9zbG9wZV9jdHJsX3ByZXYsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfbWFpbl9wcmV2IiA9IGludGVyYWN0aW9uX2N0cmxfbWFpbl9wcmV2LAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2IiA9IGludGVyYWN0aW9uX2N0cmxfaW50X3ByZXYpCiAgfQogIAogIGlmKGN0cmxzID09ICdleHAnKXsKICAgICMgcmFuZG9tIGludGVyY2VwdCByYW5kb20gc2xvcGUKICByYW5kb21fc2xvcGVfZXhwIDwtIGxtZShmaXhlZCA9IHkgfiAobHZsMV94ICsgSShsdmwxX3heMikpICsgbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgaW50ZXJhY3Rpb25fZXhwIDwtIGxtZShmaXhlZCA9IHkgfiAobHZsMV94ICsgSShsdmwxX3heMikpICogbHZsMl94LCAKICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAobHZsMV94ICsgSShsdmwxX3heMikpIHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKSAgCiAgCiAgCiAgIyBjcmVhdGUgbGlzdCB3aXRoIHJlc3VsdHMKICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGUiID0gcmFuZG9tX3Nsb3BlLAogICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24sICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfZXhwIiA9IHJhbmRvbV9zbG9wZV9leHAsCiAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9leHAiID0gaW50ZXJhY3Rpb25fZXhwKQogIH0KICAKICByZXR1cm4ocmVzdWx0cykKICAgICAgICAKfQoKIyBleHRyYWN0cyB0YWJsZSB3aXRoIGNvZWZmaWNpZW50cyBhbmQgdGVzdHMgc3RhdGlzdGljcwpleHRyYWN0X3Jlc3VsdHMgPC0gZnVuY3Rpb24obW9kZWxzKSB7CiAgCiAgbW9kZWxzX3N1bW1hcnkgPC0gbW9kZWxzICU+JSAKICBtYXAoc3VtbWFyeSkgJT4lIAogIG1hcCgidFRhYmxlIikgJT4lIAogIG1hcChhcy5kYXRhLmZyYW1lKSAlPiUgCiAgbWFwKHJvdW5kLCAxMCkgCiAgIyAlPiUgbWFwKH4gLltzdHJfZGV0ZWN0KHJvd25hbWVzKC4pLCAnSW50ZXJ8bHZsJyksXSkKICAKICByZXR1cm4obW9kZWxzX3N1bW1hcnkpCiAgCn0KCgpjb21wYXJlX21vZGVscyA8LSBmdW5jdGlvbihtb2RlbHMpIHsKCiAgbWRsX25hbWVzIDwtIG1vZGVscyAlPiUgbmFtZXMoKQogIAogIHN0ciA9ICcnCiAgZm9yIChpIGluIG1kbF9uYW1lcyl7CiAgICAKICAgIG1kbF9zdHIgPC0gcGFzdGUoJ21vZGVscyQnLCBpLCBzZXAgPSAnJykKICAgIAogICAgaWYoaSA9PSAnYmFzZWxpbmUnKXsKICAgICAgc3RyIDwtIG1kbF9zdHIKICAgIH1lbHNlewogICAgc3RyIDwtIHBhc3RlKHN0ciwgbWRsX3N0ciwgc2VwPScsICcpCiAgICB9CiAgfQogIAogIGFub3ZhX3N0ciA8LSBwYXN0ZTAoJ2Fub3ZhKCcsIHN0ciwgJyknKQogIG1kbF9jb21wIDwtIGV2YWwocGFyc2UodGV4dD1hbm92YV9zdHIpKQogIHJvd25hbWVzKG1kbF9jb21wKSA9IG1kbF9uYW1lcwogIHJldHVybihtZGxfY29tcCkKfQoKCmBgYAoKIyMgUmVzY2FsZSBEYXRhCmBgYHtyfQpkZl9nZXJfc2NhbGVkIDwtIGRmX2dlciAlPiUgZHBseXI6OnNlbGVjdChrcmVpcywgdGltZSwgcGVyc19vLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19jLCBwZXJzX2UsIHBlcnNfZSwgcGVyc19hLCBwZXJzX24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcGRlbnMsIHJhdGVfZGF5LCBzb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUKICBtdXRhdGVfYXQodmFycygta3JlaXMsIC10aW1lKSwgc2NhbGUpCgpkZl9nZXJfc2NhbGVkICU+JSBoZWFkKCkKYGBgCgoKIyMgUHJlZGljdCBwcmV2YWxlbmNlCiMjIyBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfb19jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX2NvdmlkKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKbW9kZWxzX2NfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19jJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2NfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKbW9kZWxzX2VfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2VfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfZV9jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gYWdyZWVhYmxlbmVzcwpgYGB7cn0KCm1vZGVsc19hX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2FfY292aWQpCgoKYGBgCgojIyMgcHJldmFsZW5jZSB+IG5ldXJvdGljaXNtCmBgYHtyfQoKbW9kZWxzX25fY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX25fY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9jb3ZpZCkKCgpgYGAKCiMjIFByZWRpY3Qgc29jaWFsIGRpc3RhbmNpbmcKIyMjIHNvY2lhbCBkaXN0YW5jaW5nIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3Rfc2luZ2xlX3RpbGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19vJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX29fc29jZGlzdCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX3NvY2Rpc3QpCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKbW9kZWxzX2Nfc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19jX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19zb2NkaXN0KQoKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX3NvY2Rpc3QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Vfc29jZGlzdCkKCgoKYGBgCgojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2Ffc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9zb2NkaXN0KQoKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IG5ldXJvdGljaXNtCmBgYHtyfQoKbW9kZWxzX25fc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19uX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9zb2NkaXN0KQoKCmBgYAoKIyMgRXhwbG9yZSBxdWFkcmF0aWMgdHJlbmRzIAoKIyMjIHByZXZhbGVuY2UgfiBvcGVubmVzcwpgYGB7cn0KCm1vZGVsc19vX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19vJywKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19vX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX2NvdmlkX2V4cCkKCmBgYAoKCiMjIHByZXZhbGVuY2UgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCm1vZGVsc19jX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2MnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfY19jb3ZpZF9leHApCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKbW9kZWxzX2VfY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19lX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19lX2NvdmlkX2V4cCkKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2FfY292aWRfZXhwIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdleHAnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX2NvdmlkX2V4cCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19hX2NvdmlkX2V4cCkKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBuZXVyb3RpY2lzbQpgYGB7cn0KCm1vZGVsc19uX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX24nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfbl9jb3ZpZF9leHApCgpgYGAKCiMjIENyZWF0ZSBvdmVydmlldyB0YWJsZSAKCiMjIyBEZWZpbmUgZnVuY3Rpb24gdG8gY3JlYXRlIG92ZXJ2aWV3IHRhYmxlcwpgYGB7cn0KCnN1bW1hcnlfdGFibGUgPC0gZnVuY3Rpb24obW9kZWxzLCBkdl9uYW1lKXsKCiAgdGVtcF9kZl9jdHJsX21haW4gPC0gTlVMTAogIHRlbXBfZGZfY3RybF9pbnQgPC0gTlVMTAogIAogIGZvciAoaSBpbiBtb2RlbHMpewogICAgcmVzdWx0cyA8LSBpICU+JSBleHRyYWN0X3Jlc3VsdHMoKQogICAgCiAgICByZXN1bHRzX2N0cmxfbWFpbiA8LSByZXN1bHRzJGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW1bJ2x2bDFfeDpsdmwyX3gnLF0KICAgIHRlbXBfZGZfY3RybF9tYWluIDwtIHRlbXBfZGZfY3RybF9tYWluICU+JSByYmluZChyZXN1bHRzX2N0cmxfbWFpbikKICAgIAogICAgcmVzdWx0c19jdHJsX2ludCA8LSByZXN1bHRzJGludGVyYWN0aW9uX2N0cmxfaW50X2RlbVsnbHZsMV94Omx2bDJfeCcsXQogICAgdGVtcF9kZl9jdHJsX2ludCA8LSB0ZW1wX2RmX2N0cmxfaW50ICU+JSByYmluZChyZXN1bHRzX2N0cmxfaW50KQogIH0KICAKICBuYW1lc19jdHJsX21haW4gPC0gcGFzdGUwKGR2X25hbWUsICd+JywgYygnbycsICdjJywgJ2UnLCAnYScsICduJyksICcqdGltZScsICdfY3J0bF9wb3BkZW5zJykKICBuYW1lc19jdHJsX2ludCA8LSBwYXN0ZTAoZHZfbmFtZSwgJ34nLCBjKCdvJywgJ2MnLCAnZScsICdhJywgJ24nKSwgJyp0aW1lJywgJ19jcnRsX3BvcGRlbnMqdGltZScpCgogIHJvd25hbWVzKHRlbXBfZGZfY3RybF9tYWluKSA8LSBuYW1lc19jdHJsX21haW4KICByb3duYW1lcyh0ZW1wX2RmX2N0cmxfaW50KSA8LSBuYW1lc19jdHJsX2ludAogIAogIHN1bV90YWIgPC0gcmJpbmQodGVtcF9kZl9jdHJsX21haW4sIHRlbXBfZGZfY3RybF9pbnQpICU+JSByb3VuZCg0KQogIAogIHJldHVybihzdW1fdGFiKQoKfSAKCmBgYAoKIyMjIENyZWF0ZSBvdmVydmlldyB0YWJsZXMKYGBge3J9CiMgcHJldmFsZW5jZQptb2RlbHNfcHJldiA8LSBsaXN0KG1vZGVsc19vX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfY19jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2VfY292aWQsIAogICAgICAgICAgICAgICAgICAgIG1vZGVsc19hX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfbl9jb3ZpZCkKCnN1bV90YWJfcHJldiA8LSBzdW1tYXJ5X3RhYmxlKG1vZGVsc19wcmV2LCBkdl9uYW1lID0gJ3ByZXYnKQoKd3JpdGUudGFibGUoc3VtX3RhYl9wcmV2LCBxdW90ZT1GKQoKIyBzb2NpYWwgZGlzdGFuY2luZwptb2RlbHNfc29jZGlzdCA8LSBsaXN0KG1vZGVsc19vX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19jX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19hX3NvY2Rpc3QsIAogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsc19uX3NvY2Rpc3QpCgpzdW1fdGFiX3NvY2Rpc3QgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfc29jZGlzdCwgZHZfbmFtZSA9ICdzb2NkaXN0JykKCndyaXRlLnRhYmxlKHN1bV90YWJfc29jZGlzdCwgcXVvdGU9RikKCgoKYGBgCgojIENvbmRpdGlvbmFsIHJhbmRvbSBmb3Jlc3QgYW5hbHlzaXMgCgojIyMgRXh0cmFjdCBzbG9wZXMgcHJldmFsZW5jZQpgYGB7cn0KCiMgc2xvcGUgcHJldmFsZW5jZQpkZl9nZXJfc2xvcGVfcHJldiA8LSBkZl9nZXIgJT4lIHNwbGl0KC4ka3JlaXMpICU+JSAKICBtYXAofiBsbShyYXRlX2RheSB+IHRpbWUsIGRhdGEgPSAuKSkgJT4lCiAgbWFwKGNvZWYpICU+JSAKICBtYXBfZGJsKCd0aW1lJykgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCdrcmVpcycpICU+JSAKICByZW5hbWUoc2xvcGVfcHJldiA9ICcuJykKCiMgbWVyZ2Ugd2l0aCBjb250cm9sIHZhcmlhYmxlcyAKZGZfZ2VyX3Nsb3BlX3ByZXYgPC0gZGZfZ2VyICU+JSBzZWxlY3QoLXRpbWUsIC1kYXRlLCAtcmF0ZV9kYXksIC1zb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUKICBkaXN0aW5jdCgpICU+JSAKICBpbm5lcl9qb2luKGRmX2dlcl9zbG9wZV9wcmV2LCBieSA9ICdrcmVpcycpICU+JQogIGRyb3BfbmEoKQoKZGZfZ2VyX3Nsb3BlX3ByZXYKCmBgYAoKCiMjIyBFeHRyYWN0IHNsb3BlcyBzb2NpYWwgZGlzdGFuY2luZwpgYGB7cn0KCiMgc2xvcGUgc29jZGlzdApkZl9nZXJfc2xvcGVfc29jZGlzdCA8LSBkZl9nZXIgJT4lIHNwbGl0KC4ka3JlaXMpICU+JQogIG1hcCh+IGxtKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChjb2VmKSAlPiUKICBtYXBfZGJsKCd0aW1lJykgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigna3JlaXMnKSAlPiUKICByZW5hbWUoc2xvcGVfc29jZGlzdCA9ICcuJykKCgojIG1lcmdlIHdpdGggY29udHJvbCB2YXJpYWJsZXMgCmRmX2dlcl9zbG9wZV9zb2NkaXN0IDwtIGRmX2dlciAlPiUgCiAgc2VsZWN0KC10aW1lLCAtZGF0ZSwgLXNvY2Rpc3Rfc2luZ2xlX3RpbGUsIC1yYXRlX2RheSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBpbm5lcl9qb2luKGRmX2dlcl9zbG9wZV9zb2NkaXN0LCBieSA9ICdrcmVpcycpICU+JQogIGRyb3BfbmEoKQoKZGZfZ2VyX3Nsb3BlX3NvY2Rpc3QKCmBgYAoKIyMjIEV4cGxvcmUgZGlzdHJpYnV0aW9uIG9mIHNsb3BlcwpgYGB7cn0KCmRmX2dlcl9zbG9wZV9wcmV2ICU+JSBnZ3Bsb3QoYWVzKHNsb3BlX3ByZXYpKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApCgpkZl9nZXJfc2xvcGVfc29jZGlzdCAlPiUgZ2dwbG90KGFlcyhzbG9wZV9zb2NkaXN0KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKCmBgYAoKIyBDUkYgcHJldmFsZW5jZSB+IG9wZW5uZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9vX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfbyArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX29fdmFyaW1wX3ByZXYgPC0gdmFyaW1wKGNyZl9vX2ZpdF9wcmV2LCBucGVybSA9IDEpCmNyZl9vX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9vX2ZpdF9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9vX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9vX3ZhcmltcF9jb25kX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBwcmV2YWxlbmNlIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2NfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19jICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfY192YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX2NfZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX2NfdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX2NfZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX2NfdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX2NfdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBwcmV2YWxlbmNlIH4gZXh0cmF2ZXJzaW9uCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9lX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfZSArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2VfdmFyaW1wX3ByZXYgPC0gdmFyaW1wKGNyZl9lX2ZpdF9wcmV2LCBucGVybSA9IDEpCmNyZl9lX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9lX2ZpdF9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9lX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9lX3ZhcmltcF9jb25kX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyBDUkYgcHJldmFsZW5jZSB+IGFncmVlYWJsZW5lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2FfZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19hICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfYV92YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX2FfZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX2FfdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX2FfZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX2FfdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX2FfdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBwcmV2YWxlbmNlIH4gbmV1cm90aWNpc20KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX25fZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19uICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfbl92YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX25fZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX25fdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX25fZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX25fdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX25fdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IG9wZW5uZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9vX2ZpdF9zb2NkaXN0IDwtIGNmb3Jlc3Qoc2xvcGVfc29jZGlzdCB+IHBlcnNfbyArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX29fdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9vX2ZpdF9zb2NkaXN0LCBucGVybSA9IDUpCmNyZl9vX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9vX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gNSkKCmNyZl9vX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9vX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9jX2ZpdF9zb2NkaXN0IDwtIGNmb3Jlc3Qoc2xvcGVfc29jZGlzdCB+IHBlcnNfYyArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBjZHUgKyBhZmQgKyBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2NfdmFyaW1wX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9jX2ZpdF9zb2NkaXN0LCBucGVybSA9IDUpCmNyZl9jX3ZhcmltcF9jb25kX3NvY2Rpc3QgPC0gdmFyaW1wKGNyZl9jX2ZpdF9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gNSkKCmNyZl9jX3ZhcmltcF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9jX3ZhcmltcF9jb25kX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgojIENSRiBzb2NpYWwgZGlzdGFuY2luZyB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfZV9maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2UgKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2R1ICsgYWZkICsgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9lX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfZV9maXRfc29jZGlzdCwgbnBlcm0gPSA1KQpjcmZfZV92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfZV9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDUpCgpjcmZfZV92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfZV92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfYV9maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2EgKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2R1ICsgYWZkICsgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9hX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfYV9maXRfc29jZGlzdCwgbnBlcm0gPSA1KQpjcmZfYV92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfYV9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDUpCgpjcmZfYV92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfYV92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHNvY2lhbCBkaXN0YW5jaW5nIH4gbmV1cm90aWNpc20KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX25fZml0X3NvY2Rpc3QgPC0gY2ZvcmVzdChzbG9wZV9zb2NkaXN0IH4gcGVyc19uICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGNkdSArIGFmZCArIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfbl92YXJpbXBfc29jZGlzdCA8LSB2YXJpbXAoY3JmX25fZml0X3NvY2Rpc3QsIG5wZXJtID0gNSkKY3JmX25fdmFyaW1wX2NvbmRfc29jZGlzdCA8LSB2YXJpbXAoY3JmX25fZml0X3NvY2Rpc3QsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSA1KQoKY3JmX25fdmFyaW1wX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX25fdmFyaW1wX2NvbmRfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCg==